home *** CD-ROM | disk | FTP | other *** search
- /* ボール 1994年5月22日 - 6月5日 */
- /*
- 1994年5月25日 ボールの移動処理完成
- 1994年5月26日 チェックポイント処理追加
- 1994年5月27日 ボールのバウンド音追加
- 1994年5月29日 デモ,選択,トップタイム画面追加
- 1994年5月30日 ファイルリードライト追加
- 1994年5月31日 キャラクタが鏡像になるバグ修正
- 1994年6月04日 マップデータ完成(α版完成)
- 1994年6月05日 初期仮想VRAM作成の高速化
- */
-
- /* ボール1 10箇所のチェックポイントの通過時間を競う
- ボール2 ゴールにたどり着くまでの時間を競う */
-
- #include <math.h>
- #include <stdio.h>
-
-
- #define R 32 /* 赤 */
- #define G 1024 /* 緑 */
- #define B 1 /* 青 */
-
- #define PANEL ((R+G+B)*15) /* 背景色 */
-
- #define MAX_X 896 /* 仮想VRAMのX方向の大きさ(dot単位) */
- #define MAX_Y 896 /* 仮想VRAMのY方向の大きさ(dot単位) */
-
- #define DSP_X 112 /* 表示画面のX方向の大きさ(dot単位) */
- #define DSP_Y 112 /* 表示画面のY方向の大きさ(dot単位) */
-
- #define DX (-56) /* 表示画面左上のX座標 */
- #define DY (-56) /* 表示画面左上のY座標 */
-
- #define POINT 0x1000 /* 固定少数化の倍率 */
- #define SHIFT 12 /* 固定少数化の倍率(2の乗数) */
-
- #define WALL 31 /* 壁のMAPコードの最大値 */
-
- #define LEVEL 50 /* ゲームモード0の時の障害物の数 */
-
-
- char CHRFILE[]="chr.pat"; /* キャラクタパターンファイル名 */
- char TILEFILE[]="tile.pat"; /* タイルパターンファイル名 */
- char BESTFILE[]="best.tim"; /* ベストタイムファイル名 */
- char MAPFILE[]="map.dat"; /* マップデータのファイル名 */
- char GOALFILE[]="point.pat"; /* ゴールパターンのファイル名 */
-
-
- char gwork[1540];
-
- double RAD=3.141592/180; /* ラジアン */
- short kvram[MAX_X][MAX_Y];
- unsigned int W_PAGE; /* レイア1の書き込みページ(0=(0,0) 0x20000=(0,128)) */
- unsigned int VRAM; /* VRAMの先頭アドレス */
- unsigned int MYADD; /* ボールの画面上での描画アドレス */
-
- int X=MAX_X/2; /* 仮想VRAMの中心(X座標) */
- int Y=MAX_Y/2; /* 仮想VRAMの中心(Y座標) */
-
- /* 三角関数テーブル */
- int COS[72]; /* 余弦×POINT (360°を72分割) */
- int SIN[72]; /* 正弦×(-POINT) (360°を72分割) */
-
- /* roll3用オフセットテーブル */
- int XOF[72][DSP_X],YOF[72][DSP_Y];
-
- int MAP[56][56]; /* マップ */
- /* マップコード 0 - 9 : チェックポイント
- 10 - WALL : 障害物
- WALL+1 : チェックポイントの脱け殻
- WALL+2 - : 空間 */
- /* この配置なら、障害物とチェックポイントの判定は MAP<=WALLの1回で済む。
- モード0の時はチェックポイントの通過判定は MAP==NEXT で行い、
- NEXT==10 でゴール。(NEXTの初期値は0)
- すでに通過済のチェックポイントは通過可能にするために、
- WALL+1(チェックポイントの脱け殻)に変えている。
- モード1の時は、NEXTを予め9にしておき、チェックポイントの通過判定は
- MAP<=NEXT で行う。
- こうする事で、どのチェックポイントを通過しても、NEXT==10 となるので、
- 1回のチェックポイント通過でゴールとなるうえ、ゴール用キャラクタパターンを
- 10種類使用できる。 */
-
- int CORSE[5][56][56]; /* サーキットのマップデータ */
-
- short tile[64][256]; /* 背景のキャラクタパターン
- 0 - 9 : チェックポイント(ゴール)
- 10 - WALL : 障害物
- WALL+1 : チェックポイントの脱け殻
- WALL+2 - : 空間 */
-
- short chr[13][256]; /* 背景以外のキャラクタパターン
- 0 - 9 : 数字
- 10 : ボール0
- 11 : ボール1
- 12 : ボール2 */
-
- short goal_chr[20][256]; /* ゴールのキャラクタパターン
- 0 - 9 : チェックポイント
- 10 - 19 : ゴール */
-
-
- /* ボール変数 */
- int bx,by; /* 表示画面の回転中心に対応する仮想VRAMの座標 */
- int ax,ay; /* 加速度 */
- int vx,vy; /* 速度 */
- int deg; /* 重力の方向(0 <-> 71) */
- int VX_MIN,VX_MAX,VY_MIN,VY_MAX; /* 最高速,最低速 */
- int BALL; /* ボールの種類 0:軽い 1:普通 2:重い */
- int A; /* 重力加速度(1/A) */
- int V; /* 最高速の絶対値 */
- int BOUND; /* 跳ね返り係数(%) */
-
-
- /* ビュー変数 */
- int v_next_x[10],v_next_y[10]; /* 次に通るべきチェックポイントの座標 */
- int v_flush; /* 次に通るべきチェックポイントの点滅フラグ */
- int MX,MY; /* ビューの表示位置 */
-
- int GAME=0; /* ゲーム終了フラグ 0 : ゲーム続行 1 : ゲーム終了 */
-
- int TIME; /* スタートしてからの経過時間 */
- int TIME_UP; /* 時間切れフラグ 0 : 時間内 1 : 時間切れ */
- int BEST_TIME[6][3][8]; /* ゲームモード,ボール別の最高タイム(8位) */
-
- int MODE; /* ゲームモード 0 : 10箇所のチェックポイントの通過時間を競う
- 1 - 5 : ゴールにたどり着くまでの時間を競う(コースNo) */
-
- int END; /* ステージ終了フラグ 0 : ステージ続行 1 : ステージ終了 */
-
- int NEXT; /* 次に通過するチェックポイントの番号
- ゲームモード 0 : 0 - 9 ゲームモード 1 : 9 */
-
-
-
- /* サウンド変数 */
- int spoint[6]; /* サウンドデータポインタ */
- int sinit[28]; /* サウンドデータ先頭ポインタ */
- int skunt[6]; /* カウンタ */
- int feed[6]={1,6,2,2,4,7}; /* 各チャンネルの音質 */
-
- int BF; /* バウンドフラグ(転がりの際、バウンド音が連続するのを防止するフラグ)
- 壁に接触した際の速度反転によって、反対方向に1dot以上動いたか
- 1:動いた 0:動かない(1の場合転がりなのでバウンド音は出さない) */
-
-
-
- main()
-
- {
- int i,j,k,s,rc;
-
-
- load_best(); /* ベストタイムのバイナリ形式load */
- if (load_chr()==0) return 0; /* キャラクタパターンデータのバイナリ形式load */
- if (load_tile()==0) return 0; /* タイルパターンデータのバイナリ形式load */
- if (load_map()==0) return 0; /* マップデータのバイナリ形式load */
- if (load_goal()==0) return 0; /* ゴールパターンデータのバイナリ形式load */
-
-
- init_tri(); /* 三角関数テーブルの作成 */
- init_tri3(); /* roll3用オフセットテーブルの作成 */
-
- EGB_init( gwork, 1536 ) ; /* BIOSの初期化 */
- EGB_resolution( gwork, 0, 10 ) ; /* ページ0の解像度設定(モード10) */
- EGB_resolution( gwork, 1, 10 ) ; /* ページ1の解像度設定(モード10) */
- EGB_displayPage( gwork, 1, 3 ) ; /* 表示ページの設定(両ページ) */
-
- EGB_writePage( gwork, 1 ) ; /* 書き込みページを1に */
- EGB_displayStart( gwork, 2, 4, 4 ) ; /* 表示範囲の倍率設定(4X4) */
- EGB_displayStart( gwork, 3, 128,240 ) ; /* 表示範囲の設定 */
- EGB_displayStart( gwork, 3, 160,240 ) ; /* 表示範囲の設定 */
- EGB_displayStart( gwork, 0, 0, 0 ) ; /* 表示開始位置 */
- EGB_displayStart( gwork, 1, 0, 0 ) ; /* 仮想画面中の位置 */
-
- EGB_writePage( gwork, 0 ) ; /* 書き込みページを0に */
- EGB_displayStart( gwork, 2, 2, 2 ) ; /* 表示範囲の倍率設定(2X2) */
- EGB_displayStart( gwork, 3, 320,240 ) ; /* 表示範囲の設定 */
- EGB_displayStart( gwork, 0, 0, 0 ) ; /* 表示開始位置 */
- EGB_displayStart( gwork, 1, 0, 0 ) ; /* 仮想画面中の位置 */
-
- EGB_fontStyle(gwork,1); /* 太文字 */
- EGB_textZoom(gwork,0,8,16); /* ANKの拡大率 */
- EGB_textZoom(gwork,1,16,16); /* 漢字の拡大率 */
- EGB_color(gwork,0,0x7fff); /* 文字色→白 */
-
-
- MODE=0; BALL=1; /* 初期値 */
-
- while(1) /* ゲームループ */
- {
- binit(); /* BGMの初期化 */
-
- while(1)
- {
- rc=demo(); g_cls(); /* デモ(ゲームモード,レベル選択) */
- if (rc==0) {GAME=0; break;}; /* ゲーム開始 */
- if (rc==1) select_mode(); /* ゲームモード,ボール選択画面 */
- if (rc==2) {GAME=1; break;}; /* ゲーム終了 */
- };
- if (GAME==1) /* ゲーム終了 */
- {
- save_best(); /* ベストタイムのバイナリ形式save */
- break; /*ゲームループ脱出 */
- };
-
- init();
-
- while(END==0) /* 1ステージループ */
- {
- move(); /* 仮想VRAM中の表示位置の移動 */
- s=deg+54; if (s>71) s=s-72; /* 進角 */
- roll3(XOF[s],YOF[s],VRAM+W_PAGE,kvram[0],bx>>SHIFT,by>>SHIFT);
- g_put2(MYADD+W_PAGE,chr[10+BALL]); /* ボールの表示 */
- page(W_PAGE>>10); W_PAGE=W_PAGE^0x20000; /* 改ページ */
- timer(232,106,TIME); /* 経過時間の表示 */
- bgm();
- if ((INPB(0x04d0) & 0x03)==0) /* SELECTボタン押下 -> 強制終了 */
- {END=1; TIME=15000;};
- };
-
- fm_init();
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
- top_time(); /* ベストタイム一覧表示 */
- };
-
- screenterm(gwork); /* MS-DOSの画面モードに設定する。*/
-
- };
-
-
- init()
- /* 1ゲーム毎の初期化処理 */
- {
- int i,j,k;
- int x,y;
-
- W_PAGE=0; /* レイア1の書き込みページ(0=(0,0) 0x20000=(0,128)) */
- VRAM=g_loc(0,4)+0x40000; /* VRAMの先頭アドレス */
- MYADD=VRAM+48*2-(DY+8)*0x400; /* ボールの画面上での描画アドレス */
- deg=0; /* 重力の方向 */
- ax=ay=0; /* 加速度 */
- vx=vy=0; /* 速度 */
-
- switch(BALL)
- { /* 重力加速度(1/A),最高速の絶対値,跳ね返り係数(%) */
- case 0: A=6; V=4; BOUND=70; break; /* 軽い */
- case 1: A=8; V=6; BOUND=60; break; /* 普通 */
- case 2: A=10; V=8; BOUND=50; break; /* 重い */
- };
-
- switch(MODE) /* ボールの座標(中心) */
- {
- case 0: bx=MAX_X/2*POINT; by=MAX_Y/2*POINT; break;
- case 1: bx=(6*16+8)*POINT; by=(7*16+8)*POINT; break;
- case 2: bx=(26*16+8)*POINT; by=(6*16+8)*POINT; break;
- case 3: bx=(6*16+8)*POINT; by=(7*16)*POINT; break;
- case 4: bx=(6*16+8)*POINT; by=(7*16)*POINT; break;
- case 5: bx=((56-16)*16+8)*POINT; by=(7*16)*POINT; break;
- };
-
- BF=0; /* バウンドフラグ */
-
- TIME=0; /* スタートしてからの経過時間 */
- TIME_UP=0; /* 時間切れフラグ */
- END=0; /* ステージ終了フラグ */
- if (MODE==0) NEXT=0; else NEXT=9; /* 次に通過するチェックポイントの番号 */
-
- if (MODE==0) /* マップの作成(ゲームモード0用) */
- {
- for (j=0;j<56;j++) {for (i=0;i<56;i++) MAP[j][i]=WALL+1+rnd(2);}; /* 空間*/
- for (j=0;j<6;j++) {for (i=0;i<56;i++) MAP[j][i]=MAP[55-j][i]=10;}; /*枠*/
- for (j=0;j<56;j++) {for (i=0;i<6;i++) MAP[j][i]=MAP[j][55-i]=10;}; /*枠*/
- x=(bx>>SHIFT)/16; y=(by>>SHIFT)/16;
- for (j=0;j<10;j++) /* チェックポイントキャラクタパターンの複写 */
- {for (i=0;i<256;i++) tile[j][i]=goal_chr[j][i];};
- for (i=0;i<10;i++) /* チェックポイントの作成 */
- {
- while(1) /* 空間にチェックポイント配置 */
- {
- j=rnd(43)+6; k=rnd(43)+6;
- if ( (MAP[j][k]>=WALL) && (x!=k) && (y!=j) )
- {MAP[j][k]=i; break;};
- /*if (MAP[j][k]>=(WALL+2)) {MAP[j][k]=i; break;};*/
- };
- };
- for (i=0;i<LEVEL;i++) /* 障害物の作成 */
- {
- while(1) /* 空間に障害物配置 */
- {
- j=rnd(43)+6; k=rnd(43)+6;
- if ( (MAP[j][k]>=WALL) && (x!=k) && (y!=j) ) {MAP[j][k]=11; break;};
- };
- };
- }
- else /* マップの作成(ゲームモード1以降用) */
- {
- for (j=0;j<10;j++) /* ゴールキャラクタパターンの複写 */
- {for (i=0;i<256;i++) tile[j][i]=goal_chr[j+10][i];};
- for (j=0;j<56;j++) /* コースデータをマップに複写 */
- {
- for (i=0;i<56;i++)
- {
- k=CORSE[MODE-1][j][i];
- if (k>WALL) MAP[j][i]=k+rnd(3); /* 空間なら適当なキャラクタに変換 */
- else MAP[j][i]=k; /* 空間以外ならそのままのパターンを採用 */
- };
- };
- };
-
- /* 仮想VRAMの初期画面作成 */
- k=kvram;
- for (j=0;j<56;j++)
- {
- for (i=0;i<56;i++) m_put(k+i*32,&(tile[MAP[j][i]]));
- k=k+MAX_X*32;
- };
-
- g_cls();
-
- back(); /* 背景画面の作成 */
-
- };
-
-
- /* sqr(56^2+80^2)=97≒98 */
- #define LIM_MIN 98 /* X & Y の最小値 */
- #define LIM_MAX 797 /* X & Y の最大値(895-98) */
-
-
- move()
- /* 仮想VRAM中の表示位置の移動 1994年5月25日 初版完成 */
- {
- int p;
- int wbx,wby;
- int px,py,mx,my;
- int rev_x,rev_y;
- int aw;
- int i;
- int COUNER=POINT*5;
- int map;
- int x,y;
-
- /* X=xcos+ysin Y=-xsin+ycos*/
-
- p=INPB(0x04d0);
-
- if ((p & 0x04)==0) {deg--; if (deg<0) deg=71;}; /* パッド左 */
- if ((p & 0x08)==0) {deg++; if (deg>71) deg=0;}; /* パッド右 */
-
- ax=COS[deg]/A; ay=SIN[deg]/A; /* 加速度の計算 */
-
- VX_MAX=abs(COS[deg])*V; VX_MIN=-VX_MAX; /* X方向最高速,最低速の計算 */
- aw=abs(ax); /* 最高速,最低速の変化に伴うX速度の補正*/
- if (vx>VX_MAX) {vx=vx-aw; if (vx<VX_MAX) vx=VX_MAX;};
- if (vx<VX_MIN) {vx=vx+aw; if (vx>VX_MIN) vx=VX_MIN;};
- VY_MAX=abs(SIN[deg])*V; VY_MIN=-VY_MAX; /* Y方向最高速,最低速の計算 */
- aw=abs(ay); /* 最高速,最低速の変化に伴うY速度の補正*/
- if (vy>VY_MAX) {vy=vy-aw; if (vy<VY_MAX) vy=VY_MAX;};
- if (vy<VY_MIN) {vy=vy+aw; if (vy>VY_MIN) vy=VY_MIN;};
-
- vx=vx+ax; if (vx>VX_MAX) vx=VX_MAX; if (vx<VX_MIN) vx=VX_MIN; /* X速度の計算*/
- vy=vy+ay; if (vy>VY_MAX) vy=VY_MAX; if (vy<VY_MIN) vy=VY_MIN; /* Y速度の計算*/
-
- /* 反射処理 */
- for (i=0;i<4;i++)
- {
- switch(i) /* 四隅について障害物との接触判定をする */
- {
- case 0 : wbx=bx-COUNER; wby=by-COUNER; break;
- case 1 : wbx=bx-COUNER; wby=by+COUNER; break;
- case 2 : wbx=bx+COUNER; wby=by-COUNER; break;
- case 3 : wbx=bx+COUNER; wby=by+COUNER; break;
- };
- px=((wbx+vx)>>SHIFT)/16; py=((wby+vy)>>SHIFT)/16; /*通常速度時の座標の計算*/
- mx=((wbx-vx)>>SHIFT)/16; my=((wby-vy)>>SHIFT)/16; /*反転速度時の座標の計算*/
- map=MAP[py][px]; /* 移動先のMAPコード */
- if (map<=WALL) /* 移動先が障害物(チェックポイント)なら反射処理 */
- {
- rev_x=rev_y=0; /* 反射可能フラグ */
- if (MAP[py][mx]>WALL) rev_x=1; /* X方向に反転可能 */
- if (MAP[my][px]>WALL) rev_y=1; /* Y方向に反転可能 */
- /* XY両方向反射可能 → 反転 & XY両方向速度減衰 */
- if (rev_x==rev_y)
- {vx=-vx*BOUND/100; vy=-vy*BOUND/100;
- if ( (abs(vx)>POINT) && (abs(vy)>POINT) ) BF=1;}; /*バウンドフラグオン*/
- /* X方向だけ反射可能 → X方向に反射 & X方向速度減衰 */
- if ( (rev_x==1) && (rev_y==0) )
- {vx=-vx*BOUND/100; if (abs(vx)>POINT) BF=1;}; /* バウンドフラグオン */
- /* Y方向だけ反射可能 → Y方向に反射 & Y方向速度減衰 */
- if ( (rev_x==0) && (rev_y==1) )
- {vy=-vy*BOUND/100; if (abs(vy)>POINT) BF=1;}; /* バウンドフラグオン */
- if (map<=NEXT) /* 移動先がチェックポイント */
- {
- /* ビュー上のチェックポイント消去 */
- if (MODE==0) g_pset(g_loc(MX+v_next_x[NEXT],MY+v_next_y[NEXT]),B*31);
- NEXT++; /* 次に通るチェックポイントの更新 */
- if (NEXT==10) /* ゴールイン */
- {
- fm_init(); /* 音の停止 */
- END=1; /* ステージ終了 */
- x=32; y=64;
- EGB_textZoom(gwork,1,32,32); /* 漢字の拡大率 */
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"CLEAR");
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"CLEAR");
- EGB_color(gwork,0,(R+G)*31); EGB_putSjis(gwork,x,y,"CLEAR");
- EGB_textZoom(gwork,1,16,16); /* 漢字の拡大率 */
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
- x=60; y=208;
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"Push A Button");
- EGB_color(gwork,0,0x7fff);EGB_putSjis(gwork,x+1,y+1,"Push A Button");
- EGB_color(gwork,0,R*31);EGB_putSjis(gwork,x,y,"Push A Button");
- while((INPB(0x04d0) & 0x10)==0x10); /* Aボタンを押すまで待つ */
- return 0;
- };
- MAP[py][px]=WALL+1; /* チェックポイントを脱け殻に変える */
- prtchr(kvram,px*16,py*16,tile[WALL+1+rnd(2)]);/*仮想VRAMも脱殻に変更*/
- spoint[1]=sinit[1]; skunt[1]=0; /* チェックポイント通過音発声 */
- }
- else
- {
- if (BF==1) /* 速度反転による1dot以上の移動あり(転がりでない) */
- {
- spoint[0]=sinit[0]; skunt[0]=0; /* バウンド音発声 */
- BF=0; /* バウンドフラグクリア */
- };
- };
- break; /* 反射したなら以降の障害物接触判定は中断 */
- };
- };
-
- /* ビュー上のボールの消去 */
- g_pset(g_loc(MX+(bx>>SHIFT)/16,MY+(by>>SHIFT)/16),B*31);
-
- bx=bx+vx; by=by+vy; /* 新座標の計算 */
-
- view(); /* ビューの表示 */
-
- /* 時間経過処理 */
- TIME++; /* 時間経過 */
- if (TIME>15000) /* タイムアップ */
- {
- fm_init(); /* 音の停止 */
- TIME--; /* 表示上の時間との誤差修正 */
- TIME_UP=END=1;
- x=8; y=64;
- EGB_textZoom(gwork,1,32,32); /* 漢字の拡大率 */
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"Time Up");
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"Time Up");
- EGB_color(gwork,0,(R+G)*31); EGB_putSjis(gwork,x,y,"Time Up");
- EGB_textZoom(gwork,1,16,16); /* 漢字の拡大率 */
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
- x=60; y=208;
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"Push A Button");
- EGB_color(gwork,0,0x7fff);EGB_putSjis(gwork,x+1,y+1,"Push A Button");
- EGB_color(gwork,0,R*31);EGB_putSjis(gwork,x,y,"Push A Button");
- while((INPB(0x04d0) & 0x10)==0x10); /* Aボタンを押すまで待つ */
- };
-
- };
-
-
- view_init(x,y)
- /* ビューの作成 */
- int x,y;
- {
- int i,j,m,color;
-
- MX=x; MY=y; /* ビューの表示位置 */
- v_flush=0; /* 次に通るべきチェックポイントの点滅フラグ */
-
- for (j=0;j<DSP_Y/2;j++)
- {
- for (i=0;i<DSP_X/2;i++)
- {
- m=MAP[j][i];
- if (m<10) {color=R*31; v_next_x[m]=i; v_next_y[m]=j;}
- else {if (m==10) color=PANEL; else color=B*31;};
- g_pset(g_loc(MX+i,MY+j),color);
- };
- };
-
- };
-
-
- view()
- /* ビューの表示 */
- {
- int a;
-
- /* ボールの表示 */
- g_pset(g_loc(MX+(bx>>SHIFT)/16,MY+(by>>SHIFT)/16),(R+G)*31);
-
- if (MODE==0) /* ゲームモード0の場合 */
- { /* 次のチェックポイントの点滅 */
- v_flush++; if (v_flush>20) v_flush=0;
- a=g_loc(MX+v_next_x[NEXT],MY+v_next_y[NEXT]);
- if (v_flush<10) g_pset(a,R*31); else g_pset(a,B*31);
- };
-
- };
-
-
- timer(x,y,time)
- /* 経過時間変更 */
- int x,y;
- int time;
- {
- int pos;
-
- /* 経過時間の表示 */
- pos=g_loc(x,y);
- g_put(pos,&(chr[time/10000])); time=time%10000; pos=pos+32;
- g_put(pos,&(chr[time/1000])); time=time%1000; pos=pos+32;
- g_put(pos,&(chr[time/100])); time=time%100; pos=pos+32;
- g_put(pos,&(chr[time/10])); time=time%10; pos=pos+32;
- g_put(pos,&(chr[time]));
-
- };
-
-
- top_time()
- /* ベストタイム一覧表示 */
- {
- int i;
- short x,y;
- char buf[3]={0x82,0x4f,0};
- int no=10;
-
- page(0); /* 仮想レイア0を表示画面にする */
- g_cls();
-
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
-
- for (i=0;i<8;i++) /* スコアの順位算出 */
- {if (TIME<=BEST_TIME[MODE][BALL][i]) {no=i; break;};};
- if (no!=10) /* BEST8入賞 */
- {
- for (i=7;i>no;i--) /* BEST8の入れ換え */
- BEST_TIME[MODE][BALL][i]=BEST_TIME[MODE][BALL][i-1];
- BEST_TIME[MODE][BALL][no]=TIME;
- x=120; y=56;
- EGB_color(gwork,0,R*31);
- EGB_putSjis(gwork,x+16*5+4+1,y+14+no*20+1,"←あなたの記録");
- EGB_color(gwork,0,(R+G)*31);
- EGB_putSjis(gwork,x+16*5+4,y+14+no*20,"←あなたの記録");
- };
-
- x=120; y=20;
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x,y,"コースNo");
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x+16*4,y,buf);
-
- x=10; y=12;
- g_put2(g_loc(x,y)+0x40000,chr[10+BALL]);
- switch(BALL)
- {
- case 0: EGB_putSjis(gwork,x*2+40,y*2+24,"軽い"); break;
- case 1: EGB_putSjis(gwork,x*2+40,y*2+24,"普通"); break;
- case 2: EGB_putSjis(gwork,x*2+40,y*2+24,"重い"); break;
- };
- EGB_putSjis(gwork,x*2+40+32,y*2+24,"ボール使用でのトップタイム");
-
- x=120; y=56;
- for (i=0;i<8;i++)
- {
- buf[1]=0x4f+i+1;
- EGB_color(gwork,0,R*31);
- EGB_putSjis(gwork,x-8-16*2+1,y+i*20+14+1,buf);
- EGB_putSjis(gwork,x-8-16+1,y+i*20+14+1,"位");
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x-8-16*2,y+i*20+14,buf);
- EGB_putSjis(gwork,x-8-16,y+i*20+14,"位");
- timer(x,y+i*20,BEST_TIME[MODE][BALL][i]);
- };
-
- EGB_putSjis(gwork,96,232,"Aボタン → 了解");
-
- while((INPB(0x04d0) & 0x10)==0x10); /* Aボタンを押すまで待つ */
-
- };
-
-
- back()
- /* 背景画面作成 */
- {
- int i,j,ad;
- short x,y;
- char buf[3]={0x82,0x4f,0};
-
- g_cls();
-
- /* 背景画面塗りつぶし */
- for (i=0;i<240;i++) box_full(0,i,320,i,PANEL); /* 画面塗りつぶし */
-
- /* タイトル表示 */
- x=228; y=20;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"Great");
- EGB_color(gwork,0,(R+G)*31);EGB_putSjis(gwork,x,y,"Great Fall");
- y=y+18;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1," Fall");
- EGB_color(gwork,0,(R+G)*31);EGB_putSjis(gwork,x,y," Fall");
-
- /* トップタイム表示 */
- x=232; y=64;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"Top Time");
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x,y,"Top Time");
- timer(x,y+2,BEST_TIME[MODE][BALL][0]);
-
- /* マイタイム表示 */
- x=232; y=104;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"Time");
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x,y,"Time");
- timer(x,y+2,0);
-
- /* ビュー表示 */
- x=232; y=144;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"マップ");
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x,y,"マップ");
- view_init(x+8,y+2); /* ビューの作成 */
- view(); /* ビューの表示 */
-
- /* ゲームモード表示 */
- x=232; y=232;
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+1,y+1,"コースNo");
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x+16*4+1,y+1,buf);
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x,y,"コースNo");
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x+16*4,y,buf);
-
- /* Get Ready 表示 */
- roll3(XOF[deg+54],YOF[deg+54],VRAM,kvram[0],bx>>SHIFT,by>>SHIFT);
- g_put2(MYADD,chr[10+BALL]); /* ボールの表示 */
- for (i=8;i<232;i++) box_full(0,i,DSP_X*2-1,i,0x8000); /* ゲーム画面枠消去 */
- x=44; y=64;
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"Get Ready");
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x+1,y+1,"Get Ready");
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x,y,"Get Ready");
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
- x=60; y=208;
- EGB_color(gwork,0,0); EGB_putSjis(gwork,x+2,y+2,"Push A Button");
- EGB_color(gwork,0,0x7fff);EGB_putSjis(gwork,x+1,y+1,"Push A Button");
- EGB_color(gwork,0,R*31);EGB_putSjis(gwork,x,y,"Push A Button");
- while((INPB(0x04d0) & 0x10)==0x10); /* Aボタンを押すまで待つ */
-
- for (i=8;i<232;i++) box_full(0,i,DSP_X*2-1,i,0x8000); /* ゲーム画面枠消去 */
-
- };
-
-
- demo()
- /* デモ 戻り値 0:ゲーム開始 1:ゲーム終了 */
- {
- int p,w;
- short x,y;
- char buf[3]={0x82,0x4f,0};
- int select=0;
-
- /* タイトル画面表示 */
- page(0); /* 仮想レイア0を表示画面にする */
- g_cls();
-
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
- x=0; y=40;
- EGB_textZoom(gwork,1,32,32); /* 漢字の拡大率 */
- EGB_color(gwork,0,R*31); EGB_putSjis(gwork,x+2,y+2,"Great Fall");
- EGB_color(gwork,0,(R+G)*31);EGB_putSjis(gwork,x+1,y+1,"Great Fall");
- EGB_color(gwork,0,0x7fff); EGB_putSjis(gwork,x,y,"Great Fall");
- EGB_textZoom(gwork,1,16,16); /* 漢字の拡大率 */
-
- x=24; y=72;
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x,y,"現在のコースNoは");
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x+16*8,y,buf);
- if (MODE==0)
- EGB_putSjis(gwork,28,y+20,"10箇所のチェックポイントの通過時間を競う");
- else
- EGB_putSjis(gwork,28,y+20,"ゴールにたどり着くまでの時間を競う");
-
- x=12; y=52;
- g_put2(g_loc(x,y)+0x40000,chr[10+BALL]);
- switch(BALL)
- {
- case 0: EGB_putSjis(gwork,x*2+40,y*2+24,"現在は軽いボールを使用"); break;
- case 1: EGB_putSjis(gwork,x*2+40,y*2+24,"現在は普通ボールを使用"); break;
- case 2: EGB_putSjis(gwork,x*2+40,y*2+24,"現在は重いボールを使用"); break;
- };
-
- x=120; y=160;
- box_full(x,y-16,x+16*5,y,R*31);
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x,y,"ゲーム開始");
- EGB_putSjis(gwork,x+8,y+20,"設定変更");
- EGB_putSjis(gwork,x,y+40,"ゲーム終了");
-
- EGB_putSjis(gwork,96,232,"Aボタン → 決定");
-
- while(1)
- {
- p=INPB(0x04d0);
-
- w=select;
- if ((p & 0x01)==0) /* パッド上 */
- {select--; if (select<0) select=0;};
- if ((p & 0x02)==0) /* パッド下 */
- {select++; if (select>2) select=2;};
- if (w!=select)
- {
- x=120; y=160;
- box_full(x,y+w*20-16,x+16*5,y+w*20,0);
- box_full(x,y+select*20-16,x+16*5,y+select*20,R*31);
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x,y,"ゲーム開始");
- EGB_putSjis(gwork,x+8,y+20,"設定変更");
- EGB_putSjis(gwork,x,y+40,"ゲーム終了");
- };
- if ((p & 0x10)==0) return(select); /* Aボタン */
- };
-
- };
-
-
- select_mode()
- /* ゲームモード,ボール選択画面 */
- {
- int p,i;
- int sel_mode=0;
- int end=0;
- short w0,w1;
- short x,y;
- char buf[3]={0x82,0x4f,0};
-
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
-
- /* 選択画面表示 */
- page(0); /* 仮想レイア0を表示画面にする */
- g_cls();
-
- /* 初期画面作成 */
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,40,20,"ボ-ルとコースを選択して下さい");
- EGB_putSjis(gwork,96,232,"Aボタン → 決定");
- /* ボールの表示 */
- x=24; y=32;
- for (i=0;i<3;i++) g_put2(g_loc(x+i*48,y)+0x40000,chr[10+i]);
- EGB_color(gwork,0,R*31);
- EGB_putSjis(gwork,x*2+72,y*2-8,"ボ-ル選択");
- box(24,32,320-24,132,R*31);
- for (i=0;i<3;i++)
- {
- if (i==BALL) EGB_color(gwork,0,R*31); else EGB_color(gwork,0,0x7fff);
- switch(i)
- {
- case 0: EGB_putSjis(gwork,x*2,y*2+50,"軽い"); break;
- case 1: EGB_putSjis(gwork,x*2+48*2,y*2+50,"普通"); break;
- case 2: EGB_putSjis(gwork,x*2+48*4,y*2+50,"重い"); break;
- };
- };
- y=60; x=96*BALL+44; box(x,y,x+38,y+56,R*31);
- x=24; y=140;
- EGB_color(gwork,0,0x7fff);
- EGB_putSjis(gwork,x*2+72,y+16,"コース選択");
- EGB_putSjis(gwork,x*2+72,y+40,"コースNo");
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x*2+72+16*4,y+40,buf);
- if (MODE==0)
- EGB_putSjis(gwork,28,y+60,"10箇所のチェックポイントの通過時間を競う");
- else
- EGB_putSjis(gwork,25,y+60,"ゴールにたどり着くまでの時間を競う");
-
- while(end==0)
- {
- p=INPB(0x04d0);
- switch(sel_mode)
- {
- case 0 : /* ボール選択 */
- if ((p & 0x10)==0) {end=1; break;}; /* Aボタン */
- if ((p & 0x02)==0) /* パッド下 */
- {
- EGB_color(gwork,0,0x7fff);
- x=24; y=32; EGB_putSjis(gwork,x*2+72,y*2-8,"ボ-ル選択");
- EGB_color(gwork,0,R*31);
- x=24; y=140; EGB_putSjis(gwork,x*2+72,y+16,"コース選択");
- box(24,32,320-24,132,0);
- sel_mode=1;
- box(24,132,320-24,232-20,R*31);
- };
- w0=BALL;
- if ((p & 0x04)==0) {BALL--; if (BALL<0) BALL=2;}; /* パッド左 */
- if ((p & 0x08)==0) {BALL++; if (BALL>2) BALL=0;}; /* パッド右 */
- if (BALL!=w0)
- {
- x=24; y=32;
- for (i=0;i<3;i++)
- {
- if (i==BALL) EGB_color(gwork,0,R*31); else EGB_color(gwork,0,0x7fff);
- switch(i)
- {
- case 0: EGB_putSjis(gwork,x*2,y*2+50,"軽い"); break;
- case 1: EGB_putSjis(gwork,x*2+48*2,y*2+50,"普通"); break;
- case 2: EGB_putSjis(gwork,x*2+48*4,y*2+50,"重い"); break;
- };
- };
- y=60; x=96*w0+44; box(x,y,x+38,y+56,0);
- x=96*BALL+44; box(x,y,x+38,y+56,R*31);
- };
- break;
- case 1 : /* ゲームモード選択 */
- if ((p & 0x10)==0) {end=1; break;}; /* Aボタン */
- if ((p & 0x01)==0) /* パッド上 */
- {
- EGB_color(gwork,0,R*31);
- x=24; y=32; EGB_putSjis(gwork,x*2+72,y*2-8,"ボ-ル選択");
- EGB_color(gwork,0,0x7fff);
- x=24; y=140; EGB_putSjis(gwork,x*2+72,y+16,"コース選択");
- box(24,132,320-24,232-20,0);
- sel_mode=0;
- box(24,32,320-24,132,R*31);
- };
- w1=MODE;
- if ((p & 0x04)==0) {MODE--; if (MODE<0) MODE=5;}; /* パッド左 */
- if ((p & 0x08)==0) {MODE++; if (MODE>5) MODE=0;}; /* パッド右 */
- if (MODE!=w1)
- {
- x=24; y=140;
- box_full(x*2+72+16*4,y+40-16,x*2+72+16*5,y+40,0);
- EGB_color(gwork,0,0x7fff);
- buf[1]=0x4f+MODE; EGB_putSjis(gwork,x*2+72+16*4,y+40,buf);
- box_full(25,y+60-16,320-25,y+60,0);
- EGB_color(gwork,0,0x7fff);
- if (MODE==0)
- EGB_putSjis(gwork,28,y+60,"10箇所のチェックポイントの通過時間を競う");
- else
- EGB_putSjis(gwork,25,y+60,"ゴールにたどり着くまでの時間を競う");
- };
- break;
- };
- };
- g_cls();
-
- };
-
-
- box(x0,y0,x1,y1,color)
- /* BOX描画 */
- short x0,y0; /* 左上座標 */
- short x1,y1; /* 右下座標 */
- short color; /* 色 */
- {
- short para[5]; /* EGB_Connect パラメータ */
-
- EGB_color(gwork,0,color); /* 色の設定 */
-
- para[0]=2;
- para[1]=x0; para[2]=y0; para[3]=x0; para[4]=y1;
- EGB_unConnect(gwork,para); /* 線分を描く */
- para[1]=x0; para[2]=y1; para[3]=x1; para[4]=y1;
- EGB_unConnect(gwork,para); /* 線分を描く */
- para[1]=x1; para[2]=y1; para[3]=x1; para[4]=y0;
- EGB_unConnect(gwork,para); /* 線分を描く */
- para[1]=x1; para[2]=y0; para[3]=x0; para[4]=y0;
- EGB_unConnect(gwork,para); /* 線分を描く */
-
-
- };
-
-
- box_full(x0,y0,x1,y1,color)
- /* BOX描画(full) */
- short x0,y0; /* 左上座標 */
- short x1,y1; /* 右下座標 */
- short color; /* 色 */
- {
- short para[5]; /* EGB_Connect パラメータ */
- short i;
-
- EGB_color(gwork,0,color); /* 色の設定 */
-
- para[0]=2;
- for (i=y0;i<=y1;i++)
- {para[1]=x0; para[2]=para[4]=i; para[3]=x1; EGB_unConnect(gwork,para);};
-
- };
-
-
-
- page(hed)
- /* レイア1のハードスクロール */
- int hed; /* レイア1の画面表示開始位置 */
- {
- asm(" pushl %edx");
- asm(" movl 12(%esp),%eax"); /* hed */
- asm(" andl $0xff,%eax");
- asm(" roll $8,%eax");
- asm(" pushl %eax"); /* FA1 */
- asm(" movw $0x440,%dx");
- asm(" movb $21,%al");
- asm(" outb %al,%dx");
- asm(" popl %eax"); /* FA1 */
- asm(" movw $0x442,%dx");
- asm(" outw %ax,%dx");
- asm(" popl %edx");
-
- };
-
-
- init_tri()
- /* 三角関数テーブルの作成 */
- {
- int i,j;
- double r; /* 回転角 */
-
- for (i=0;i<72;i++)
- {
- r=(360/72*i)*RAD; /* ラジアンへの変換 */
- COS[i]=cos(r)*POINT; SIN[i]=sin(r)*POINT;
- };
-
- };
-
-
- init_tri3()
-
- {
- /* X=xcos+ysin Y=-xsin+ycos*/
- int i,j,o1,o2;
-
- for (i=0;i<72;i++)
- {
- for (j=0;j<DSP_X;j++)
- {
- o1=(DX+DSP_X)-j; o2=(DY+DSP_Y)-j;
- XOF[i][j]=(((COS[i]*o1)>>12)+((SIN[i]*o1)>>12)*MAX_X)*2;
- YOF[i][j]=(((-SIN[i]*o2)>>12)+((COS[i]*o2)>>12)*MAX_X)*2;
- };
- };
-
- };
-
-
- roll3(xof,yof,vram,kvram,kx,ky)
- /* 44 48 52 56 60 64 */
- /* 画面回転(高速版2) 1994年3月29日 */
- /* 改良 3月30日 */
- /* X=xcos+ysin Y=-xsin+ycos*/
- int *xof; /* (cos×x(56:-56)-sin×y(56:-56)×MAX_X)×2 */
- int *yof; /* (-sin×x(56:-56)-cos×y(56:-56)×MAX_X)×2 */
- int vram; /* VRAM左上アドレス */
- short *kvram; /* 仮想VRAM先頭アドレス -> 中心アドレス */
- int kx,ky; /* 仮想VRAM回転中心座標 -> X方向オフセット1,2*/
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl $0x0104");
- asm(" popl %es");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 64(%esp),%eax"); /* 中心 Y座標 */
- asm(" movl $896,%ebx"); /* MAX_X */
- asm(" mull %ebx");
- asm(" addl 60(%esp),%eax"); /* 中心 X座標+中心 Y座標×MAX_X */
- asm(" addl %eax,%eax"); /* ×2(仮想VRAM 中心座標のオフセット) */
- asm(" addl %eax,56(%esp)"); /* +仮想VRAM先頭アドレス=>中心アドレス */
-
- asm(" movl 44(%esp),%ebp"); /* XOF先頭アドレス */
- asm(" subl $4,%ebp"); /* XOF先頭アドレス-4 */
- asm(" movl 48(%esp),%ebx"); /* YOF先頭アドレス */
- asm(" subl $4,%ebx"); /* YOF先頭アドレス-4 */
- asm(" movl $112,%ecx"); /* Y方向オフセット(1:DSP_Y) */
- asm("lpY3: movl 56(%esp),%edx"); /* 仮想VRAM中心アドレス */
- asm(" addl %ss:(%ebx,%ecx,4),%edx"); /* kvram(中心)+YOF */
- asm(" movl 52(%esp),%edi"); /* VRAM先頭アドレス */
- asm(" pushl %ecx");
- asm(" movl $112,%ecx"); /* X方向オフセット(1:DSP_X) */
-
- asm("lpX3:");
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 1*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 2*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 3*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 4*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 5*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 6*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 7*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" decl %ecx"); /* X方向オフセット-1 */
-
- asm(" movl (%ebp,%ecx,4),%esi"); /* XOF 8*/
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" loopl lpX3"); /* X方向オフセット-1 */
-
- asm(" popl %ecx");
- asm(" addl $0x0400,52(%esp)"); /* VRAMアドレス+0x400 */
- asm(" loopl lpY3"); /* Y方向オフセット-1 */
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
-
-
- prtchr(kvram,x,y,chr)
- /* パターン転送 1994年2月9日 */
- short *kvram; /* 仮想VRAM先頭アドレス */
- int x,y; /* 転送座標左上 */
- short *chr; /* キャラクタ先頭アドレス */
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl %ss");
- asm(" popl %es");
- asm(" pushl %ss");
- asm(" popl %ds");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 52(%esp),%eax"); /* 転送先 Y座標 */
- asm(" movl $896,%ebx");
- asm(" mull %ebx"); /* ×MAX_X */
- asm(" addl 48(%esp),%eax"); /* 転送先 X座標 */
- asm(" addl %eax,%eax"); /* ×2 */
- asm(" addl 44(%esp),%eax"); /* 仮想VRAM描画開始アドレス */
- asm(" movl %eax,%edi");
-
- asm(" movl 56(%esp),%esi"); /* キャラクタ先頭アドレス */
- asm(" movl $16,%ebx"); /* Y方向ループカウンタ */
- asm("LY: movl $16,%ecx"); /* X方向ループカウンタ */
- asm("LX: lodsw"); /* キャラクタ -> ax & キャラクタアドレス+2 */
- asm(" orw %ax,%ax");
- asm(" jz skip"); /* キャラクタがNULL dotなら転送しない */
- asm(" stosw"); /* ax -> 仮想VRAM & 仮想VRAM描画アドレス+2 */
- asm(" loop LX");
- asm(" addl $1760,%edi"); /* 仮想VRAM描画アドレス+(MAX_X-16)×2 */
- asm(" decl %ebx");
- asm(" jnz LY");
-
- asm(" popl %es");
-
- asm(" popal");
-
- asm(" leave");
- asm(" ret");
-
- asm("skip: addl $2,%edi"); /* 仮想VRAM描画アドレス+2 */
- asm(" loop LX");
- asm(" addl $1760,%edi"); /* 仮想VRAM描画アドレス+(MAX_X-16)×2 */
- asm(" decl %ebx");
- asm(" jnz LY");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
- int g_put2(a,c)
- /* 16X16dot put */
- int a; /* VRAMアドレス */
- short c[]; /* キャラクタデータ先頭アドレス */
-
- {
- asm(" pushl %ebx");
- asm(" pushl %edx");
- asm(" pushl %esi");
- asm(" pushl %edi"); /* スタック +16 */
-
- asm(" movl 24(%esp),%eax"); /* VRAM アドレス */
- asm(" movl 28(%esp),%ebx"); /* キャラクタデータ アドレス */
-
- asm(" pushl %ds");
-
- asm(" pushl $0x0104"); /* VRAM セレクタ */
- asm(" popl %ds");
-
- asm(" movl $0,%esi"); /* VRAM X方向オフセット */
- asm(" movl $0,%edi"); /* キャラクタデータオフセット */
- asm("lva:movw %ss:(%ebx,%edi,2),%edx");/* キャラクタデータ(2バイト)をedxにロード */
- asm(" orw %edx,%edx"); /* ヌルドットは表示しない */
- asm(" jz pn");
- asm(" movw %edx,(%eax,%esi,2)"); /* edxをVRAMにストア */
- asm("pn: incl %edi");
- asm(" incl %esi");
- asm(" cmpl $16,%esi"); /* 1行分のループ */
- asm(" jnz lva");
- asm(" movl $0,%esi"); /* VRAM X方向オフセットのクリア */
- asm(" addl $0x400,%eax"); /* VRAMアドレスの更新 */
- asm(" cmpl $256,%edi"); /* 16X16dot分のループ */
- asm(" jnz lva");
-
- asm(" popl %ds");
-
- asm(" popl %edi");
- asm(" popl %esi");
- asm(" popl %edx");
- asm(" popl %ebx");
-
- };
-
-
- m_put(a,chr)
- /* マップ作成用パターン転送 1994年6月5日 */
- short *a; /* 転送先仮想VRAM先頭アドレス */
- short *chr; /* キャラクタ先頭アドレス */
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl %ss");
- asm(" popl %es");
- asm(" pushl %ss");
- asm(" popl %ds");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 44(%esp),%edi"); /* 仮想VRAM描画開始アドレス */
- asm(" movl 48(%esp),%esi"); /* キャラクタ先頭アドレス */
- asm(" movl $16,%ebx"); /* Y方向ループカウンタ */
- asm("LM: movl $16,%ecx"); /* X方向ループカウンタ */
- asm(" repw");
- asm(" movsw"); /* chr -> 仮想VRAM & chrアドレス+2,仮想VRAMアドレス+2 */
- asm(" addl $1760,%edi"); /* 仮想VRAM描画アドレス+(MAX_X-16)×2 */
- asm(" decl %ebx");
- asm(" jnz LM");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
- /* チャンネル 0 : バウンド音
- 1 : チェックポイント通過音
- 2 :
- 3 :
- 4 :
- 5 :
- */
- #define T0 1 /* バウンド音のテンポ */
-
- int sdata[]={ /* サウンドデータ OCT,TONE,VOL,LONG */
- /* 音階 0 1 2 3 4 5 6 7 8 9 10 11 12
- 休 C C# D D# E F F# G G# A A# B */
-
- -1, /* No0 バウンド音 */
- 5,12, 0,T0,
- 6,1 , 0,T0,
- 6,2 , 4,T0,
- 6,1 , 8,T0,
- 6,2 ,12,T0,
- 6,1 ,20,T0,
- 6,2 ,28,T0,
- 6,1 ,36,T0,
- 0, 0,128,0,
-
- -1, /* No1 チェックポイント通過音 */
- 5,12, 0,T0,
- 5,12, 0,T0,
- 6,1 , 0,T0,
- 6,2 , 1,T0,
- 6,1 , 2,T0,
- 6,2 , 3,T0,
- 6,1 , 4,T0,
- 6,2 , 5,T0,
- 6,1 , 6,T0,
- 6,2 , 7,T0,
- 6,1 , 8,T0,
- 6,2 , 9,T0,
- 6,1 ,10,T0,
- 6,2 ,12,T0,
- 6,1 ,14,T0,
- 6,2 ,16,T0,
- 6,1 ,18,T0,
- 6,2 ,20,T0,
- 6,1 ,22,T0,
- 6,2 ,24,T0,
- 6,1 ,26,T0,
- 6,2 ,28,T0,
- 6,1 ,30,T0,
- 0, 0,128,0,
-
- -1,
- -2
- };
-
-
- binit()
- /* BGM処理の初期化 */
- {
- int i,j;
-
- for (i=j=0;sdata[i]!=-2;i++)
- {
- if (sdata[i]==-1) {sinit[j]=i+1; j++;}; /* サウンドデータ先頭位置の算出 */
- };
-
- for (i=0;i<6;i++) spoint[i]=0; /* サウンドデータポインタの初期化 */
-
- fm_init();
-
- };
-
-
- bgm()
- /* BGM処理 */
- {
- int ch,oct,tone,vol;
-
- for (ch=0;ch<6;ch++)
- {
- if (sdata[spoint[ch]]>-1) /* 休止状態でない */
- {
- skunt[ch]--;
- if (skunt[ch]<0) /* 変音時期 */
- {
- oct=sdata[spoint[ch]]; spoint[ch]++;
- tone=sdata[spoint[ch]]; spoint[ch]++;
- vol=sdata[spoint[ch]]; spoint[ch]++;
- skunt[ch]=sdata[spoint[ch]]; spoint[ch]++;
- fm_sound(ch,oct,tone,vol,feed[ch]);
- };
- };
- };
-
- };
-
-
- load_chr()
- /* キャラクタパターンデータのバイナリ形式load */
- {
- int i,j,k;
- unsigned int h,l,end_f;
- int no;
- FILE *fp;
-
- fp=fopen(CHRFILE,"rb"); if (fp==NULL) return 0;
-
- end_f=0;
-
- for (no=0;((no<13)&&(end_f==0));no++)
- {
- for (i=0;((i<16)&&(end_f==0));i++)
- {
- for (j=0;((j<16)&&(end_f==0));j++)
- {
- h=getc(fp); l=getc(fp); chr[no][j+16*i]=h*0x100+l;
- if (feof(fp)!=0) end_f=1;
- };
- };
- };
- fclose(fp);
-
- return 1;
-
- };
-
-
- load_tile()
- /* タイルデータのバイナリ形式load */
- {
- int i,j,k;
- unsigned int h,l,end_f;
- int no;
- FILE *fp;
-
- fp=fopen(TILEFILE,"rb"); if (fp==NULL) return 0;
-
- end_f=0;
-
- for (no=0;((no<96)&&(end_f==0));no++)
- {
- for (i=0;((i<16)&&(end_f==0));i++)
- {
- for (j=0;((j<16)&&(end_f==0));j++)
- {
- h=getc(fp); l=getc(fp); tile[no][j+16*i]=h*0x100+l;
- if (feof(fp)!=0) end_f=1;
- };
- };
- };
- fclose(fp);
-
- return 1;
-
- };
-
-
- load_best()
- /* ベストタイムのバイナリ形式load */
- {
- int i,j,k;
- unsigned int h,l;
- FILE *fp;
-
- for (i=0;i<8;i++) /* ベストタイムのクリア */
- {
- for (j=0;j<6;j++)
- {for (k=0;k<3;k++) BEST_TIME[j][k][i]=7000+i*500;};
- };
- fp=fopen(BESTFILE,"rb"); if (fp==NULL) return 0;
-
- for (i=0;i<6;i++)
- {
- for (j=0;j<3;j++)
- {
- for (k=0;k<8;k++)
- {h=getc(fp); l=getc(fp); BEST_TIME[i][j][k]=h*0x100+l;};
- };
- };
-
- fclose(fp);
-
- };
-
-
- save_best()
- /* ベストタイムのバイナリ形式save */
- {
- int i,j,k;
- unsigned char h,l;
- FILE *fp;
-
- fp=fopen(BESTFILE,"wb"); if (fp==NULL) return 0;
-
- for (i=0;i<6;i++)
- {
- for (j=0;j<3;j++)
- {
- for (k=0;k<8;k++)
- {
- h=BEST_TIME[i][j][k]/0x100; putc(h,fp);
- l=BEST_TIME[i][j][k]%0x100; putc(l,fp);
- };
- };
- };
-
- fclose(fp);
-
- };
-
-
- load_map()
- /* マップデータのバイナリ形式load */
- {
- int i,j,k;
- FILE *fp;
-
- fp=fopen(MAPFILE,"rb"); if (fp==NULL) return 0;
-
- for (k=0;k<5;k++)
- {
- for (j=0;j<56;j++) {for (i=0;i<56;i++) CORSE[k][j][i]=getc(fp);};
- };
-
- fclose(fp);
-
- return 1;
-
- };
-
-
- load_goal()
- /* ゴールパターンデータのバイナリ形式load */
- {
- int i,j,k;
- unsigned int h,l;
- int no;
- FILE *fp;
-
- fp=fopen(GOALFILE,"rb"); if (fp==NULL) return(0);
-
- for (no=0;no<20;no++)
- {
- for (i=0;i<16;i++)
- {
- for (j=0;j<16;j++)
- {
- h=getc(fp); l=getc(fp); goal_chr[no][j+16*i]=h*0x100+l;
- };
- };
- };
-
- fclose(fp);
-
- return 1;
-
- };